package cn.kgc.reflect.base;

import cn.kgc.pojo.User;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class ReflectDemo {

    public static void main(String[] args) throws Exception {

        //创建用户对象
        User u=new User();
      //  u.password="111111";
      //  u.drink();
       // ------------ 1  根据类的全限定名获取字节码对象
         Class c1=  Class.forName("cn.kgc.pojo.User");
        // 2 根据类名获取字节码对象
        Class c2= User.class;
        //3 根据对象获取字节码对象
        Class c3=u.getClass();

        //获取构造器对象  public User(int age,string name,date b,long,boolean bt)
        Constructor con=c1.getDeclaredConstructor(int.class);//无参
        //Object obj= con.newInstance();
       // Object obj2= c2.newInstance();
        con.setAccessible(true);
        Object obj=con.newInstance(3);

        //System.out.println(c1==c2&&c2==c3);
        // 如何给字段赋值
            //1公有字段
                Field f=c1.getField("password");
                f.set(obj,"123456");
        if(obj instanceof User){
            System.out.println(obj);
        }
            // 2 私有字段
        Field f2=c1.getDeclaredField("username");
        f2.setAccessible(true);
        f2.set(obj,"admin");
        if(obj instanceof User){
            System.out.println(obj);
        }
        //如何调用类中的方法
                //对象.方法(参数)
            Method m1=c3.getMethod("drink",int.class);
            m1.invoke(obj,300);
        Method m2=c3.getDeclaredMethod("eat");
        m2.setAccessible(true);
        m2.invoke(obj);
        //--所有的构造 字段 方法操作-----------------
            c1.getFields();
            c1.getDeclaredFields();
            c1.getMethods();
            c1.getDeclaredMethods();
            c1.getConstructors();
            c1.getDeclaredConstructors();

    }
}
